package web.study.tag;

import java.io.IOException;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;

import org.apache.taglibs.standard.tag.rt.core.ForEachTag;

public class TRTag extends TagSupport
{
    /**
     * 序列化
     */
    private static final long serialVersionUID = 1L;
    
    @Override
    public int doStartTag()
        throws JspException
    {
        // 返回tr标签的父标签的对象实例 
        Tag tag = getParent();
        
        // 如果tr标签的父标签的对象实例是ForEachTag，则继续执行下面的操作 
        if (tag instanceof ForEachTag)
        {
            ForEachTag forEachTag = (ForEachTag)tag;
            
            // 获得forEach标签当前迭代的元素 
            Object current = forEachTag.getLoopStatus().getCurrent();
            
            // 如果当前迭代的元素为null，不处理该元素 
            if (current == null)
            {
                return Tag.SKIP_BODY;
            }
            
            // 如果当前迭代的元素类型是java.util.List，继续处理当前迭代的元素 
            if (current instanceof List)
            {
                List<?> row = (List<?>)current;
                
                // 开始生成<tr>...</tr> 
                String tr = "<tr>";
                for (Object cell : row)
                {
                    tr += "<td>" + cell + "</td>";
                }
                tr += "</tr>";
                try
                {
                    // 将生成的<tr>...</tr>输出的客户端 
                    pageContext.getOut().write(tr);
                }
                catch (IOException e)
                {
                }
            }
            // 如果当前迭代的元素类型不是java.util.List，则抛出JspException异常 
            else
            {
                throw new JspException("当前元素必须是java.util.List类型！");
            }
        }
        // 如果tr标签的父标签的对象实例不是ForEachTag，则抛出JspException异常 
        else
        {
            throw new JspException("continue标签必须在forEach标签体中使用！");
        }
        return Tag.SKIP_BODY;
    }
}
